"""
======================
Author: 柠檬班-小简
Time: 2022/11/7 21:30
Project: day11_framwork_V8
Company: 湖南零檬信息技术有限公司
======================
"""
from loguru import logger
from jsonpath import jsonpath

from tools.handle_replace import replace_mark_by_data
# def assert_equal():
#     pass
#
# def assert_contains():
#     pass

def assert_resp_data(resp_dict, assert_action_str, share_obj):
    """
    :param resp_dict: 请求的响应结果。字典格式。
    :param assert_action_str: 在excel当中读取出来的断言列。是字符串的形式，要转成列表。
    :return: 列表。列表里面存放的是，每条断言的结果。True还是False.
    """
    # 是否有替换。如果有则先替换。
    assert_action_str = replace_mark_by_data(assert_action_str, share_obj)
    # 如果有换行，则去掉字符串里的换行符。
    assert_action_str = assert_action_str.replace("\n", "")
    # 替换完成，转换成字典。
    assert_action = eval(assert_action_str)
    # 多条断言表达式，比对结果存储.
    assert_result_list = []

    # 遍历所有的断言表达式。每一条都是先提取实际结果，再比对期望结果。
    for index, one_assert in enumerate(assert_action):
        logger.info(f"第{index+1}个断言内容：\n{one_assert}")
        # 第一步：先从响应结果中，通过jsonpath提取实际值。
        res = jsonpath(resp_dict, one_assert.get("expr"))
        logger.info(f"使用jsonpath从响应数据中提结果值为：{res}")
        if res:
            real_value = res[0]
        else:
            # assert False  # 抛异常。AssertionError
            logger.error("没有提取到值！！请检查你的jsonpath表达式！！")
            assert_result_list.append(False)
            logger.info("往比对结果assert_result_list中添加False！！")
            # 本次循环跳过。使用continue
            continue

        # 是否有要对提取出来的结果，进行二次处理。比如获取长度。
        if one_assert.get("add_action"):
            if one_assert.get("add_action") == "len":
                real_value = len(real_value)
                logger.info(f"对提取之后的数据，获取它的长度，并设置为实际结果。长度为{real_value}")

        # 第二步：根据比对type,对期望与实际进行比较。 左边是实际结果，右边是期望结果。
        if one_assert.get("compare_type") == ">":
            logger.info("实际结果 大于 期望结果？")
            result = (real_value > one_assert.get("expected"))
        else:
            logger.info("实际结果 等于 期望结果？")
            result = (real_value == one_assert.get("expected"))

        logger.info(f"比较结果为：{result}")
        assert_result_list.append(result)
        logger.info(f"往比对结果assert_result_list中添加{result}！！")

    logger.info(f"assert_result_list的值为：{assert_result_list}")
    # 返回最终的结果列表
    return assert_result_list

if __name__ == '__main__':
    resp_dict = {"access_token": "b7a280d5-4978-431d-8977-50b7a77e21d5",
                 "token_type": "bearer",
                 "refresh_token": "3b0606ad-aedd-4f6d-83d5-e579fe3f85b0",
                 "expires_in": 1295999,
                 "pic": None,
                 "userId": "c8cb632642f34e838bf794d6bc92178f",
                 "nickName": "cute_cute",
                 "enabled": True}
    assert_action = """[
        {"expr": "$..userId", "expected": 32, "compare_type": "==", "add_action": "len"},
        {"expr": "$..nickName", "expected": "cute_cute", "compare_type": "=="},
        {"expr": "$..enabled", "expected": True, "compare_type": "=="}
    ]"""

    res = assert_resp_data(resp_dict, assert_action)
    print(res)